iT邦幫忙

2021 iThome 鐵人賽

DAY 13
0

13 - migration notes

Database GUI

上個專案跟這個專案剛好 db 都是用 mysql,分享一下匯入資料的方法,還有一些 migration 問題的一些筆記,另外個人滿推以下兩種 database 的 GUI:

兩者都滿好用的也其實都差不多,因為同事都用 Sequal Pro 還有個人剛好也偏好,所以後來主要都是用 Sequal Pro。

連結的方式也很容易,點選左下角的 + 號來新增 new favorite database 名稱,還有設定一些 config 來連結即可,最常用的大概就是把 staging/production 的 database 弄到 local 來重現問題。

點選 export 後選取需要的 table 並輸出 SQL file,詳細的其他需求就看當下需要的使用情況。

import sql to database in local

  mysql -u root `database_name` < ~/Desktop/export_database_name_with_date_time.sql

database_name 看要匯入的資料庫是哪一個?對應各個 database 後的 ENV 名稱,Rails 6 也支援 multiple database,詳細可以參考 active_record_multiple_databases

  # config > database.yml

  default: &default
  writer:
    adapter:  mysql2
    encoding: utf8mb4
    pool:     20
    host:     <%= ENV['DATABASE_WRITER_HOST'] %>
    database: <%= ENV['DATABASE_NAME'] %>
    username: <%= ENV['DATABASE_USER'] %>
    password: <%= ENV['DATABASE_PASS'] %>
    charset:  utf8
  reader:
    adapter:  mysql2
    encoding: utf8mb4
    pool:     20
    host:     <%= ENV['DATABASE_READER_HOST'] %>
    database: <%= ENV['DATABASE_NAME'] %>
    username: <%= ENV['DATABASE_USER'] %>
    password: <%= ENV['DATABASE_PASS'] %>
    charset:  utf8
  anotherdb:
    adapter:  mysql2
    encoding: utf8
    pool:     20
    host:     <%= ENV['ANOTHERDB_HOST'] %>
    database: <%= ENV['ANOTHERDB_NAME'] %>
    username: <%= ENV['ANOTHERDB_USER'] %>
    password: <%= ENV['ANOTHERDB_PASS'] %>
    migrations_paths: "db/anotherdb_migrate"
  # ...

Add column after specific field

時不時會有新的欄位需要新增的到舊有的 table 裡面,但預設 default 的都會在 updated_at 之後,不管是在 GUI 裡看或者是 console 裡面看都會滿不容易觀看的,且如果是與原本的欄位有關聯,會偏向擺在一起,因此我們可以在 migration 中帶 after option 來告知新增在哪個欄位之後,也因為會是先跑 first_name 再跑 last_name 欄位的新增,自然而然 last_name 要新增時可以排在 first_name 之後。

  # 20210914230020_add_first_name_and_last_name_to_user.rb
  class AddFirstNameAndLastNameToUser < ActiveRecord::Migration[6.1]
    def change
      add_column :users, :first_name, :string, after: :id
      add_column :users, :last_name,  :string, after: :first_name
    end
  end

Explicitly specify a Model's table-name

在建立 table_name 的時候有時候剛好撞到 rails 的慣例,但又不想要取慣例的名字的時候,會需要想設定自己想要的 Table 名稱,像是名為 Index class,Rails 預設會是 indices,但可能對我們來說很不直覺,想要取叫做 indexes 比較合適

  # migration
  class CreateIndexes < ActiveRecord::Migration[6.1]
    def change
      create_table :indexes do |t|
        # ...
        t.timestamps
      end
    end
  end

  # app > models > index.rb
  class Index < ApplicationRecord
    self.table_name = "indexes"
  end

參考來源

My blog


上一篇
冒險村12 - rescue exception
下一篇
冒險村14 - counter cache
系列文
冒險村-30 Day Ruby on Rails Tips Challenge30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言